"""
对于字符串 S 和 T，只有在 S = T + ... + T（T 与自身连接 1 次或多次）时，我们才认定 “T 能除尽 S”。

返回最长字符串 X，要求满足 X 能除尽 str1 且 X 能除尽 str2。

示例 1：

输入：str1 = "ABCABC", str2 = "ABC"
输出："ABC"
示例 2：

输入：str1 = "ABABAB", str2 = "ABAB"
输出："AB"
示例 3：

输入：str1 = "LEET", str2 = "CODE"
输出：""

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/greatest-common-divisor-of-strings
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
"""

"""
思路:
对于一个字符串,如果要有子因子,那么他的子因子,最多只有他的一半长度,或者是全部字符串
先从全部长度判断,然后判断一半长度到1的所有子串

看了一下别人的算法..

var gcdOfStrings = function(str1, str2) {
  if (str1 + str2 !== str2 + str1) return ''
  const gcd = (a, b) => (0 === b ? a : gcd(b, a % b))
  return str1.substring(0, gcd(str1.length, str2.length))
};

作者：wonderful611
链接：https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/1071-zi-fu-chuan-de-zui-da-gong-yin-zi-by-wonderfu/
来源：力扣（LeetCode）
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
"""


"""
复习了一下最大公因式
gcd = lambda a, b: a if 0 == b else gcd(b, a % b)
"""
from typing import List
class Solution:
    def gcdOfStrings(self, str1: str, str2: str) -> str:
        if str1 + str2 != str2 + str1:
            return ""
        gcd = lambda a, b: a if 0 == b else gcd(b, a % b)
        return str1[: gcd(len(str1), len(str2))]

        
if __name__ == "__main__":
    Solution().gcdOfStrings("ABCABC", "ABC")





def test():
    assert Solution().gcdOfStrings("ABCABC", "ABC") == "ABC"
    assert Solution().gcdOfStrings("ABABAB", "ABABAB") == "ABABAB"
    assert Solution().gcdOfStrings("ABABABAB", "ABAB") == "ABAB"
    assert Solution().gcdOfStrings("abcd", "abc") == ""
    assert Solution().gcdOfStrings("ABABAB", "ABAB") == "AB"
    assert Solution().gcdOfStrings("ABAABA", "ABA") == "ABA"
    assert Solution().gcdOfStrings("cda", "cdab") == ""
    assert Solution().gcdOfStrings("ABAABAABAABAABAABA", "ABAABAABA") == "ABAABAABA"


